package services

import (
	"crypto/sha256"
	"strings"
)

const (
	// 使用安全的字符集，避免容易混淆的字符
	idChars  = "23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz"
	idLength = 8 // 生成 8 位长度的 ID
)

// GenerateShortID 基于输入字符串生成一个确定性的短 ID
func GenerateShortID(input string) string {
	// 使用 SHA-256 生成输入字符串的哈希值
	hasher := sha256.New()
	hasher.Write([]byte(input))
	hash := hasher.Sum(nil)

	// 生成最终的短 ID
	result := make([]byte, idLength)
	for i := 0; i < idLength; i++ {
		// 使用哈希值的不同部分来确定每个位置的字符
		index := int(hash[i]) % len(idChars)
		result[i] = idChars[index]
	}

	return string(result)
}

// ValidateID 验证一个 ID 是否符合我们的规则
func ValidateID(id string) bool {
	if len(id) != idLength {
		return false
	}

	// 验证字符是否都在允许的字符集中
	for _, c := range id {
		if !strings.ContainsRune(idChars, c) {
			return false
		}
	}

	return true
}
